"""
# -*- coding: utf-8 -*-
# @Time    : 2023/6/14 11:22
# @Author  : 王摇摆
# @FileName: libsvm.py
# @Software: PyCharm
# @Blog    ：https://blog.csdn.net/weixin_44943389?type=blog
"""

# 导入工具库
import pandas as pd
import xgboost as xgb

# 从libsvm文件中读取数据，做二分类
# 数据是libsvm的格式，如下样本格式
# 1 3:1 10:1 11:1 21:1 30:1 34:1 36:1 40:1 41:1 53:1 58:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 105:1 117:1 124:1
# 0 3:1 10:1 20:1 21:1 23:1 34:1 36:1 39:1 41:1 53:1 56:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 106:1 116:1 120:1
# 0 1:1 10:1 19:1 21:1 24:1 34:1 36:1 39:1 42:1 53:1 56:1 65:1 69:1 77:1 86:1 88:1 92:1 95:1 102:1 106:1 116:1 122:1
dtrain = xgb.DMatrix('../data/agaricus.txt.train')
dtest = xgb.DMatrix('../data/agaricus.txt.test')
print('1. 数据集加载成功')

# 超参数设定
# 主要是树深、学习率、目标函数
param = {'max_depth': 2, 'eta': 1, 'verbosity': 0, 'objective': 'binary:logistic'}
# 设定watchlist用于建模过程中观测模型状态
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
num_round = 2
print('2. 模型初始化完成')

bst = xgb.train(param, dtrain, num_round, watchlist)  # 在这里输出模型观测结果
print('3. 模型学习完毕')

# 使用模型预测
preds = bst.predict(dtest)
print('4. 模型推理完毕')
# 判断准确率
labels = dtest.get_label()
print('错误率为%f' % \
      (sum(1 for i in range(len(preds)) if int(preds[i] > 0.5) != labels[i]) / float(len(preds))))
# 将预测结果和真实标签整理成DataFrame
df = pd.DataFrame({'Prediction': preds, 'Label': labels})
print(df)

# 模型存储
bst.save_model('./model/0001.model')
print('5. 模型存储成功')
